import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# 假设你的Excel文件名为'example.xlsx'，并且你想读取第一个工作表

df = pd.read_excel('datas.xlsx', engine='openpyxl')  # 对于.xlsx文件，使用'openpyxl'作为引擎

# 假设df是你的DataFrame
# 我们只选择特征列（不包括日期和承压指数）作为X，承压指数作为y
X = df[['正面信息', '负面信息', '中性信息', '拥堵指数', '物价指数']].values
y = df['承压指数'].values

# 数据标准化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建DNN（多层感知机）模型
# 这里我们添加了两个隐藏层，每个隐藏层有64个神经元，并使用ReLU激活函数
model = Sequential()
model.add(Dense(512, input_dim=X.shape[1], activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))  # 输出层，只有一个神经元，用于预测承压指数

# 编译模型
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型
model.fit(X_train, y_train, epochs=1000, batch_size=16, verbose=1)

# 评估模型
loss = model.evaluate(X_test, y_test)
print('Test loss:', loss)

# 预测
predictions = model.predict(X_test)

# 打印predictions的内容

for i, prediction in enumerate(predictions):
    # 因为prediction可能是一个一维数组（即使只有一个元素），我们使用prediction[0]来获取值

    print(f"Prediction for sample {i}: {prediction[0]}")

# 或者，如果你想看到整个predictions数组的结构和内容（但不那么详细），可以直接打印predictions

print(predictions)